发布订阅模式与观察者模式区别?
发布订阅模式
订阅者
把自己想订阅的事件注册
到调度中心
- 当
发布者
发布该事件
到调度中心
,也就是该事件触发
- 由调度中心
统一调度
订阅者注册到调度中心的处理代码
观察者模式
观察者
直接订阅主题
- 而当主题被激活的时候
- 会触发
观察者里的事件
两者区别
- 观察者模式里只有两个角色:观察者和被观察者。
- 发布订阅模式里有三种角色:发布者、订阅者、调度器(第三者)。
- 在观察者模式中,观察者是知道 Subject 的,Subject 一直保持对观察者进行记录。
- 在发布订阅模式中,发布者和订阅者不知道对方的存在。它们只有通过消息代理进行通信。
- 在发布订阅模式中,组件是松散耦合的,正好和观察者模式相反。
- 观察者模式主要以同步方式实现,即当某些事件发生时,Subject 调用其所有观察者的适当方法。
- 发布者/订阅者在大多情况下是异步方式(使用消息队列)
综上:观察者模式和发布订阅模式本质上都有发布订阅的思想,但是又有一定的区别,所以我们不能将二者完全等同起来。
应用场景
观察者模式在很多场景中都在使用,除了原生 DOM 上监听事件外,还有最常用的是 Vue 组件中父子之间的通信。
订阅发布模式应用场景是在跨多层组件通信时,如果利用父子组件通信一层层订阅发布,可维护性和灵活性很差,一旦中间某个环节出问题,整个传播链路就会瘫痪。这时采用独立出来的 EventBus 解决这类问题,只要能访问到 EventBus 对象,便可通过该对象订阅和发布事件。